package presentation.beans;

import java.io.Serializable;

import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;

import metier.PersonneAction;

/**
 * @author Florent
 * 
 */
@Named
@SessionScoped
public class PersonneBean implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -4261929307287010332L;
	/**
	 * @generated
	 */
	private Long idPersonne;
	/**
	 * @generated
	 */
	private String nomPersonne;
	/**
	 * @generated
	 */
	private String prenomPersonne;

	/**
	 * @generated
	 */
	private java.util.List<AffectationBean> affectation = new java.util.ArrayList<AffectationBean>();
	/**
	 * @generated
	 */
	private java.util.List<TacheBean> tache = new java.util.ArrayList<TacheBean>();

	/**
	 * @generated
	 */
	private String loginPersonne;
	/**
	 * @generated
	 */
	private String passwordPersonne;
	/**
	 * 
	 */
	private PersonneBean sessionPersonne;

	/**
	 * 
	 */
	private PersonneBean AdministrationPersonne;

	/**
	 * @return
	 */
	public PersonneBean getSessionPersonne() {
		return sessionPersonne;
	}

	/**
	 * @param sessionPersonne
	 */
	public void setSessionPersonne(final PersonneBean sessionPersonne) {
		this.sessionPersonne = sessionPersonne;
	}

	/**
	 * 
	 */
	public PersonneBean() {

	}

	/**
	 * @return
	 */
	public Long getIdPersonne() {
		return idPersonne;
	}

	/**
	 * @param idPersonne
	 */
	public void setIdPersonne(final Long idPersonne) {
		this.idPersonne = idPersonne;
	}

	/**
	 * @return
	 */
	public java.util.List<AffectationBean> getAffectation() {
		return affectation;
	}

	/**
	 * @return
	 */
	public PersonneBean getAdministrationPersonne() {
		return AdministrationPersonne;
	}

	/**
	 * @param administrationPersonne
	 */
	public void setAdministrationPersonne(
			final PersonneBean administrationPersonne) {
		AdministrationPersonne = administrationPersonne;
	}

	/**
	 * @param affectation
	 */
	public void setAffectation(final java.util.List<AffectationBean> affectation) {
		this.affectation = affectation;
	}

	/**
	 * @param affectationBean
	 */
	public void addAffectation(final AffectationBean affectationBean) {
		getAffectation().add(affectationBean);
	}

	/**
	 * @param affectationBean
	 */
	public void removeAffectation(final AffectationBean affectationBean) {
		getAffectation().remove(affectationBean);
	}

	/**
	 * @return
	 */
	public String getNomPersonne() {
		return nomPersonne;
	}

	/**
	 * @param nomPersonne
	 */
	public void setNomPersonne(final String nomPersonne) {
		this.nomPersonne = nomPersonne;
	}

	/**
	 * @return
	 */
	public String getPrenomPersonne() {
		return prenomPersonne;
	}

	/**
	 * @param prenomPersonne
	 */
	public void setPrenomPersonne(final String prenomPersonne) {
		this.prenomPersonne = prenomPersonne;
	}

	/**
	 * @return
	 */
	public java.util.List<TacheBean> getTache() {
		return tache;
	}

	/**
	 * @param tache
	 */
	public void setTache(final java.util.List<TacheBean> tache) {
		this.tache = tache;
	}

	/**
	 * @return
	 */
	public String getLoginPersonne() {
		return loginPersonne;
	}

	/**
	 * @param loginPersonne
	 */
	public void setLoginPersonne(final String loginPersonne) {
		this.loginPersonne = loginPersonne;
	}

	/**
	 * @return
	 */
	public String getPasswordPersonne() {
		return passwordPersonne;
	}

	/**
	 * @param passwordPersonne
	 */
	public void setPasswordPersonne(final String passwordPersonne) {
		this.passwordPersonne = passwordPersonne;
	}

	/**
	 * @return
	 */
	public String doLogin() {
		final HttpServletRequest request = (HttpServletRequest) (FacesContext
				.getCurrentInstance().getExternalContext().getRequest());
		final PersonneAction personneAction = new PersonneAction();
		if (personneAction.login(this)) {
			this.sessionPersonne = (PersonneBean) request.getSession()
					.getAttribute("user");
			return "index";
		}
		return "login";
	}

	/**
	 * @return
	 */
	public String doCreate() {
		final PersonneAction personneAction = new PersonneAction();
		if (!personneAction.existUser(this.getLoginPersonne())) {
			personneAction.createUser(this);
			final FacesContext facesContext = FacesContext.getCurrentInstance();
			return ((PersonneAdministrationBean) facesContext.getApplication()
					.createValueBinding("#{sessionScope.personneAdministrationBean}")
					.getValue(facesContext)).doGoAdministration();
		}
		FacesContext.getCurrentInstance().addMessage(
				null,
				new FacesMessage(FacesMessage.SEVERITY_ERROR,
						"login déjà utilisé", "login déjà utilisé"));
		return "#";
	}

	/**
	 * @return
	 */
	public String doGoAdminCreate() {
		final FacesContext facesContext = FacesContext.getCurrentInstance();
		PersonneBean admin = new PersonneBean();
//		final PersonneBean admin = (PersonneBean) facesContext.getApplication()
//				.createValueBinding("#{personneBean}").getValue(facesContext);
		admin.setAdministrationPersonne(new PersonneBean());
		facesContext.getApplication().createValueBinding("#{sessionScope.personneBean}")
				.setValue(facesContext, admin);
		return "userAdminCreation";
	}

	/**
	 * @return
	 */
	public String doUpdate() {
		final PersonneAction personneAction = new PersonneAction();
		if (!personneAction.existUser(this.getLoginPersonne())) {
			personneAction.updateCurrentUser(this);
			updateFromSession();
			return "index";
		}
		if (personneAction.getPersonneBeanFromId(this.getIdPersonne())
				.getLoginPersonne().equals(this.getLoginPersonne())) {
			personneAction.updateCurrentUser(this);
			updateFromSession();
			return "index";
		}
		FacesContext.getCurrentInstance().addMessage(
				null,
				new FacesMessage(FacesMessage.SEVERITY_ERROR,
						"login déjà utilisé", "login déjà utilisé"));
		return "#";
	}

	/**
	 * @return
	 */
	public String doGoUpdate() {
		updateFromSession();
		return "userModification";
	}

	/**
	 * @return
	 */
	public static PersonneBean doGetUserFromSession() {
		final HttpServletRequest request = (HttpServletRequest) (FacesContext
				.getCurrentInstance().getExternalContext().getRequest());
		return (PersonneBean) request.getSession().getAttribute("user");
	}

	/**
	 * 
	 */
	public void updateFromSession() {
		this.sessionPersonne = doGetUserFromSession();
		this.setIdPersonne(this.sessionPersonne.getIdPersonne());
		this.setLoginPersonne(this.sessionPersonne.getLoginPersonne());
		this.setNomPersonne(this.sessionPersonne.getNomPersonne());
		this.setPasswordPersonne(this.sessionPersonne.getPasswordPersonne());
		this.setPrenomPersonne(this.sessionPersonne.getPrenomPersonne());
		this.setAffectation(this.sessionPersonne.getAffectation());
		this.setTache(this.sessionPersonne.getTache());
	}

	/**
	 * @param personneBean
	 */
	public static void saveToSession(PersonneBean personneBean) {
		final HttpServletRequest request = (HttpServletRequest) (FacesContext
				.getCurrentInstance().getExternalContext().getRequest());
		request.getSession().setAttribute("user", personneBean);
	}

	/**
	 * 
	 */
	public void reloadFromDatabase() {
		final PersonneAction personneAction = new PersonneAction();
		final PersonneBean personneBean = personneAction
				.updateFromDatabase(doGetUserFromSession());
		saveToSession(personneBean);
		updateFromSession();
	}

	/**
	 * @return
	 */
	public String doGoAdminConsultation() {
		final FacesContext facesContext = FacesContext.getCurrentInstance();
		PersonneBean admin = (PersonneBean) facesContext.getApplication()
				.createValueBinding("#{sessionScope.personneBean}").getValue(facesContext);
		admin.setAdministrationPersonne(this);
		facesContext.getApplication().createValueBinding("#{sessionScope.personneBean}")
				.setValue(facesContext, admin);
		return "userAdminConsultation";
	}

	/**
	 * @return
	 */
	public String doGoAdminUpdate() {
		final FacesContext facesContext = FacesContext.getCurrentInstance();
		final PersonneBean admin = (PersonneBean) facesContext.getApplication()
				.createValueBinding("#{sessionScope.personneBean}").getValue(facesContext);
		admin.setAdministrationPersonne(this);
		facesContext.getApplication().createValueBinding("#{sessionScope.personneBean}")
				.setValue(facesContext, admin);
		return "userAdminModification";
	}

	/**
	 * @return
	 */
	public String doAdminUpdate() {
		final PersonneAction personneAction = new PersonneAction();
		if (!personneAction.existUser(this.getLoginPersonne())) {
			personneAction.updateAdminUser(this);
			final FacesContext facesContext = FacesContext.getCurrentInstance();
			return ((PersonneAdministrationBean) facesContext.getApplication()
					.createValueBinding("#{personneAdministrationBean}")
					.getValue(facesContext)).doGoAdministration();
		}
		if (personneAction.getPersonneBeanFromId(this.getIdPersonne())
				.getLoginPersonne().equals(this.getLoginPersonne())) {
			personneAction.updateAdminUser(this);
			final FacesContext facesContext = FacesContext.getCurrentInstance();
			return ((PersonneAdministrationBean) facesContext.getApplication()
					.createValueBinding("#{personneAdministrationBean}")
					.getValue(facesContext)).doGoAdministration();
		}
		FacesContext.getCurrentInstance().addMessage(
				null,
				new FacesMessage(FacesMessage.SEVERITY_ERROR,
						"login déjà utilisé", "login déjà utilisé"));
		return "#";
	}

	/**
	 * @return
	 */
	public String doAdminDelete() {
		final PersonneAction personneAction = new PersonneAction();
		personneAction.deleteUser(this);
		final FacesContext facesContext = FacesContext.getCurrentInstance();
		return ((PersonneAdministrationBean) facesContext.getApplication()
				.createValueBinding("#{personneAdministrationBean}")
				.getValue(facesContext)).doGoAdministration();
	}

	/**
	 * @return
	 */
	public String isLogged() {
		final HttpServletRequest request = (HttpServletRequest) (FacesContext
				.getCurrentInstance().getExternalContext().getRequest());
		if (request.getSession().getAttribute("user").equals(null))
			return "login";
		return "";
	}

	/**
	 * @return
	 */
	public String doLogout() {
		final HttpServletRequest request = (HttpServletRequest) (FacesContext
				.getCurrentInstance().getExternalContext().getRequest());
		request.getSession().invalidate();
		return "login";
	}
	public String doGoSchedule(){
		return "agendaConsultation";
	}
}
